Pinvon's Blog

所见, 所闻, 所思, 所想

精通比特币读书笔记--2

比特币网络

P2P 网络架构

比特币采用了基于国际互联网的 P2P 网络架构. P2P 的意思是每个节点都是对等的, 没有服务端, 分层等概念.

除了 P2P 协议之外, 比特币网络中还运行了 Stratum协议(挖矿).

节点类型及角色

每个比特币节点都是路由, 区块链数据库, 挖矿, 钱包四个服务的集合. 其中, 全节点的区块链数据库是完整的拷贝.

除了全节点之外, 还有"轻量级节点(SPV节点)"的概念. 这种节点只保留了区块链的一部分, SPV节点 也有区块链数据库, 只不过这里的数据只是完整区块链的一部分.

区块链

区块链的数据结构是由包含交易信息的区块按照从远到近的顺序有序链接起来的.

对每个区块头进行 SHA256 加密哈希, 可生成一个哈希值, 可以通过这个哈希值唯一地区别一个区块, 区块头中有一个字段, 包含了父区块的哈希值, 根据这个值, 可以将区块一个一个链接起来. 正因为这个特征, 所以如果父区块有任何改动, 父区块哈希值会随着改变, 最终导致当前区块的哈希值也会改变. 如果被改变的区块后面包含许多区块, 重新计算这些区块的哈希值将会耗费大量的计算资源, 所以一个长区块链的存在, 可以让区块链的历史不可改变, 这是比特币安全的一个重要原因.

区块结构

区块头: 80B

平均每个交易: 250B

平均每个区块包含的交易数: 500

数据结构如下表所示:

Size Field Description
4B Block Size 区块大小
80B Block Header 区块头
1-9B Transaction Counter 交易数
Variable Transactions 交易

区块头

Size Field Description
4B Version 版本号
32B Previous Block Hash 上一个区块的哈希值
32B Merkle Root Merkle 树根节点的哈希值
4B Timestamp 时间戳
4B Difficulty Target 该区块的工作量证明算法的难度目标
4B Nonce 难题的解

注意, Merkle树是一种用来有效地总结区块中所有交易的数据结构.

区块标识符: 区块头哈希值和区块高度

区块哈希值可以唯一地标识一个区块.

区块高度是找出一个区块的必要不充分条件. 因为有可能多个区块在竞争同一高度.

区块哈希值和区块高度实际上都不存在区块的数据结构里, 它们一般被存储在一个独立的数据库表中, 以便于索引, 更快地从磁盘检索区块.

创世区块

区块链里的第一个区块.

将区块加入区块链

假设前一个区块的区块头哈希值为: 00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249

则新块的内容类似如下:

{
    "size" : 43560,
    "version" : 2,
    "previousblockhash" : "00000000000000027e7ba6fe7bad39faf3b5a83daed765f05f7d1b71a1632249",
    "merkleroot" : "5e049f4030e0ab2debb92378f53c0a6e09548aea083f3ab25e1d94ea1155e29d",
    "time" : 1388185038,
    "difficulty" : 1180923195.25802612,
    "nonce" : 4215469401,
    "tx" : [
        "257e7497fb8bc68421eb2c7b699dbab234831600e7352f0d9e6522c7cf3f6c77",
        ...
        "05cfd38f6ae6aa83674cc99e4d75a1458c165b7ab84725eda41d018a09176634"
        ]
}

Merkle树

区块链中的每个区块都包含了产生于该区块的所有交易, 以 Merkle树 表示.

Merkle树 是一种哈希二叉树, 它是一种用作快速归纳和校验大规模数据完整性的数据结构.

在比特币网络中, Merkle树 被用来归纳一个区块中的所有交易, 同时生成整个交易集合的数字指纹, 且提供了一种校验区块是否存在某交易的高效途径. 当 N 个数据元素经过加密后插入 Merkle树 时, 可以用很高的效率计算出某元素是否在该树中.

Merkle树 的构建

Merkle树 是自底向上构建的. 假设有 A, B, C, D 四个交易, 构建的 Merkle树 如下所示:

78.png

交易哈希化后存储在相应的叶子节点. 如: \(H_A = SHA256(SHA256(Transaction A))\)

而 \(H_{AB}\) 是将 \(H_A\) 和 \(H_B\) 进行串联后, 再哈希化得到的值.

最终, 得到了 Merkle根, 产生的 32B 的哈希值存储在区块头.

Comments

使用 Disqus 评论
comments powered by Disqus